Quiero usar el siguiente código, pero sin indexar la matriz con "[][]" y sustituirlo por punteros
for (int i = 0; i < argc; i++) { for (int j = 0; argv[i][j] != '\0'; j++) { //code } }Sé que puede usar punteros para atravesar una matriz, pero no estoy seguro de cómo hacerlo con una longitud indefinida en la segunda matriz, en este caso, la cadena de entrada. Dado que cada elemento de argv[] puede tener una longitud diferente, quiero asegurarme de poder leer correctamente los caracteres y saber cuándo finaliza cada elemento de argv[] y comienza el siguiente.
Espero que sea algo como: (Si el siguiente encabezado de main es incorrecto, dígamelo).
int main(int argc, char **argv) { for (int i = 0; i < argc; i++) { while(argv != '\0') { //code *argv+1; } //to skip null character argv+1; } }Dado que el último elemento en argv es NULL , no necesita indexarlo ni comparar nada con argc si realmente no lo desea.
int main(int argc, char *argv[]) { for (char **arg = argv; *arg; ++arg) { // for each arg for (char *p = *arg; *p; ++p) { // for each character process(*p); } } } *arg será NULL al final de la lista de argumentos, lo cual es falso. *p será '\0' al final de cada cadena, lo cual es falso.
Desde N1256 5.1.2.2.1/2
Si se declaran, los parámetros de la función principal deberán obedecer a las siguientes restricciones:
— El valor de argc será no negativo.
— argv[argc] será un puntero nulo.
Dado for loop permite cualquier tipo de valores, no necesariamente números enteros para su "índice de bucle", su bucle podría reescribirse así:
for (char **a = argv ; a != argv+argc ; a++) { for(char *p = *a ; *p != '\0' ; p++) { // code uses *p instead of argv[i][j] } } El ciclo interno usa p como la variable de ciclo, que se incrementa con el p++ regular y se verifica con *p != '\0' . La condición del ciclo se podría acortar a *p , por lo que el ciclo interno se vería así:
for(char *p = *a ; *p ; p++)Sí, puede iterar a través de argv usando punteros.
El ciclo interno le dice a p que apunte al comienzo de argv+i y lo recorra hasta llegar a \0 .
#include <stdio.h> int main(int argc, char **argv) { int i; char *p; for(i=0; i < argc; i++) { for(p=*(argv+i); *p; p++) printf("%c", *p); printf("\n"); } }Si solo está interesado en atravesar cada argumento, pero no está interesado en analizar cada carácter, simplemente puede hacerlo.
#include <stdio.h> int main(int argc, char **argv) { int i; char *p; for(i=0; i < argc; i++) { printf("Argument position %d is %s\n", i, *(argv+i)); } }